#ifdef _WIN32
  #define SCHANNEL_CIPHER(a,b,c,d,e) ,a,b,c,d,e
#else
  #define SCHANNEL_CIPHER(a,b,c,d,e)
#endif


struct st_cipher_suite {
  const char *rfc_name;
  const char *openssl_name;
  const char *gnutls_name;
  const char *nss_name;
#ifdef _WIN32  
  ALG_ID exch;
  ALG_ID encrypt;
  ALG_ID hash;
  ALG_ID sign;
  int strength;
#endif
};

const struct st_cipher_suite tls_ciphers[] =
{
  { /* RFC cipher ID 0x000013 */
    "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
    "DHE-DSS-DES-CBC3-SHA",
    "TLS_DHE_DSS_3DES_EDE_CBC_SHA1",
    "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_3DES, CALG_SHA1, CALG_DSS_SIGN, 0)
  },
  { "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
    "DHE-DSS-AES128-SHA",
    "TLS_DHE_DSS_AES_128_CBC_SHA1",
    "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_AES_128, CALG_SHA1,CALG_DSS_SIGN, 0)
  },
  { "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
    "DHE-DSS-AES256-SHA",
    "TLS_DHE_DSS_AES_256_CBC_SHA1",
    "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_AES_256, CALG_SHA1, CALG_DSS_SIGN, 0)
  },
  { "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
    "DHE-DSS-AES256-SHA256",
    "TLS_DHE_DSS_AES_256_CBC_SHA256",
    "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_AES_256, CALG_SHA_256, CALG_DSS_SIGN, 0)
  },
  { "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
    "DHE-RSA-AES128-GCM-SHA256",
    "TLS_DHE_RSA_AES_128_GCM_SHA256",
    "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_AES_128, CALG_SHA_128, 0, 0
  )},
  { "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
    "DHE-RSA-AES256-GCM-SHA384",
    "TLS_DHE_RSA_AES_256_GCM_SHA384",
    NULL
    SCHANNEL_CIPHER(CALG_DH_EPHEM, CALG_AES_256, CALG_SHA384, 0, 0)
  },
  { "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    "ECDHE-ECDSA-AES128-SHA",
    "TLS_ECDHE_ECDSA_AES_128_CBC_SHA1",
    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"
    SCHANNEL_CIPHER(CALG_ECDSA, CALG_AES128, CALG_SHA1, 0, 0)
  },
  { "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
    "ECDHE-ECDSA-AES128-GCM-SHA256",
    "TLS_ECDHE_ECDSA_AES_128_GCM_SHA256",
    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"
    SCHANNEL_CIPHER(CALG_ECDSA, CALG_AES128, CALG_SHA256, 0, 0)
  },
  { "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA384",
    NULL,
    NULL,
    NULL
    SCHANNEL_CIPHER(CALG_ECDSA, CALG_AES128, CALG_SHA384, 0, 0)
  },
  { "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    "ECDHE-ECDSA-AES256-SHA",
    "TLS_ECDHE_ECDSA_AES_256_CBC_SHA1",
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"
    SCHANNEL_CIPHER(CALG_ECDSA, CALG_AES256, CALG_SHA1, 0, 0)
  },
  { "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
    "ECDHE-ECDSA-AES256-SHA384",
    "TLS_ECDHE_ECDSA_AES_256_CBC_SHA384",
    NULL
    SCHANNEL_CIPHER(CALG_ECDSA, CALG_AES256, CALG_SHA384, 0, 0)
  },
  { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    "ECDHE-RSA-AES128-SHA",
    "TLS_ECDHE_RSA_AES_128_CBC_SHA1",
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
    SCHANNEL_CIPHER(0xAE06, CALG_AES128, CALG_SHA1, 0, 0)
  }, 
  { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
    "ECDHE-RSA-AES128-SHA256",
    "TLS_ECDHE_RSA_AES_128_CBC_SHA256",
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
    SCHANNEL_CIPHER(0xAE06, CALG_AES128, CALG_SHA256, 0, 0)
  }, 
  { "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA256",
    NULL,
    NULL,
    NULL
    SCHANNEL_CIPHER(0xAE06, CALG_AES256, CALG_SHA256, 0, 0)
  }, 
  { "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
    "ECDHE-RSA-AES256-SHA384",
    "TLS_ECDHE_RSA_AES_256_CBC_SHA384",
    NULL
    SCHANNEL_CIPHER(0xAE06, CALG_AES256, CALG_SHA384, 0, 0)
  }, 
  { "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA",
    NULL,
    NULL,
    "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_3DES, CALG_SHA1, 0, 0)
  },
  { "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
    NULL,
    "TLS_RSA_3DES_EDE_CBC_SHA1",
    "TLS_RSA_WITH_3DES_EDE_CBC_SHA"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_3DES,  CALG_SHA1, 0, 0)
  },
  { "TLS_RSA_WITH_AES_128_CBC_SHA",
    "AES128-SHA",
    "TLS_RSA_AES_128_CBC_SHA1",
    "TLS_RSA_WITH_AES_128_CBC_SHA"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_128, CALG_SHA1, 0, 0)
  },
  { "TLS_RSA_WITH_AES_128_CBC_SHA256",
    "AES128-SHA256",
    "TLS_RSA_AES_128_CBC_SHA256",
    "TLS_RSA_WITH_AES_128_CBC_SHA256"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_128, CALG_SHA256, 0, 0)
  },
  { "TLS_RSA_WITH_AES_128_GCM_SHA256",
    "AES128-GCM-SHA256",
    "TLS_RSA_AES_128_GCM_SHA256",
    "TLS_RSA_WITH_AES_128_GCM_SHA256"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_128, CALG_SHA256, 0, 0)
  },
  { "TLS_RSA_WITH_AES_256_CBC_SHA",
    "AES256-SHA",
    "TLS_RSA_AES_256_CBC_SHA1",
    "TLS_RSA_WITH_AES_256_CBC_SHA"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_256, CALG_SHA1, 0, 0)
  },
  { "TLS_RSA_WITH_AES_256_CBC_SHA256",
    "AES256-SHA256",
    "TLS_RSA_AES_256_CBC_SHA256",
    "TLS_RSA_WITH_AES_256_CBC_SHA256"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_256, CALG_SHA_256,0, 0)
  },
  { "TLS_RSA_WITH_AES_256_GCM_SHA384",
    "AES256-GCM-SHA384",
    "TLS_RSA_AES_256_GCM_SHA384",
    NULL
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_AES_256, CALG_SHA384, 0, 0)
  },
  { "TLS_RSA_WITH_NULL_SHA256",
    "NULL-SHA256",
    "TLS_RSA_NULL_SHA256",
    "TLS_RSA_WITH_NULL_SHA256"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, 0, CALG_SHA_256, 0, 0)
  },
  { "TLS_RSA_WITH_RC4_128_MD5",
    NULL,
    "TLS_RSA_ARCFOUR_128_MD5",
    "TLS_RSA_WITH_RC4_128_MD5"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_RC4, CALG_MD5, 0, 0)
  },
  { "TLS_RSA_WITH_RC4_128_SHA",
    NULL,
    "TLS_RSA_ARCFOUR_128_SHA1",
    "TLS_RSA_WITH_RC4_128_SHA"
    SCHANNEL_CIPHER(CALG_RSA_KEYX, CALG_RC4, CALG_SHA1,0, 0)
  },
  { NULL,
    NULL,
    NULL,
    NULL
    SCHANNEL_CIPHER(0, 0, 0, 0, 0)}
};
